UDP をブロードキャストするサービスを作る
UDP の受信方法
動作確認で必要なので覚えておこう。
一度だけ受信したい人は
$ nc -ul 39391
で十分、socat 不要。 nc -ulk 39391 だとずっと Listen できる。
code:sh
sudo apt install socat
sudo socat -T 1 -u UDP-LISTEN:39390,fork STDOUT
UDP をブロードキャストするプログラム
python を使うと簡単に作れる。socket モジュールそのまま使うだけ便利
python -m venv .venv で仮想環境を作ってね( .venv/bin/activate でアクティベートを忘れずに )。
code:main.py
import socket
HOST_NAME = ''
PORT = 39391
host = socket.gethostname()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
message = message.encode("utf-8")
sock.sendto(message, (HOST_NAME, PORT))
sock.close()
定期実行の仕組み
systemd.timer を使う。Unit で service を指定する。 [Timer] で 30s ごとに値を入れる
code:/etc/systemd/system/udp3939x.timer
# /etc/systemd/system/udp3939x.timer
Description=udp3939x
OnBootSec=30s
OnUnitActiveSec=30s
Unit=udp3939x.service
WantedBy=timers.target
Unit の設定
code:/etc/systemd/system/udp3939x.service
# /etc/systemd/system/udp3939x.service
Description=udp3939x
Type=oneshot
User=pi
Group=pi
WorkingDirectory=/home/pi/workspace/mikumiku
ExecStart=/home/pi/workspace/mikumiku/.venv/bin/python ./main.py
WantedBy=multi-user.target
実行してみよう
code:sh
sudo systemctl start udp3939x.service
エラーがでなければOK。
エラーが出たら次のコマンドでエラーを見よう!
code:sh
sudo journalctl -u udp3939x.service
udp3939x.service のファイルに間違いがあるようなら、次のコマンドでエラーを確認しよう。
code:sh
sudo systemctl status udp3939x.service
定期実行させる
code:sh
sudo systemctl enable udp3939x.service
sudo systemctl enable udp3939x.timer
UDP の受信方法 の方法をみて受信できるか見てみよう!